<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>jQuery tablesorter 2.0 - Semver Sorting</title>

	<!-- jQuery -->
	<script src="js/jquery-latest.min.js"></script>

	<!-- Demo stuff -->
	<link rel="stylesheet" href="css/jq.css">
	<link href="css/prettify.css" rel="stylesheet">
	<script src="js/prettify.js"></script>
	<script src="js/docs.js"></script>

	<!-- Tablesorter: required -->
	<link rel="stylesheet" href="../css/theme.blue.css">
	<script src="../js/jquery.tablesorter.js"></script>
	<script src="../js/extras/semver-mod.js"></script>

	<style id="css">td.red { color: red; }</style>

	<script id="js">$(function() {

	// Set up empty table with second and first columns pre-sorted
	$("table").tablesorter({
		theme : 'blue',
		// sortList: [[1,0]],
		textSorter : {
			1 : function(a,b) {
				if (a === b) { return 0; }
				if (window.semver && semver.valid(a) !== null && semver.valid(b) !== null) {
					// valid version numbers, use semver.gt() method (greater than)
					return semver.gt(a, b) ? 1 : -1;
				} else {
					// invalid version number or semver not included -> basic text sort
					return a > b ? 1 : (a < b ? -1 : 0);
				}
			}
		},
		// extra code to highlight invalid semver numbers
		initialized : function(table){
			var $cell,
				c = table.config,
				column = 1; // search second column (zero-based index)
			if (window.semver) {
				c.$tbodies.each(function(tbindex, tb){
					$(tb).children('tr').each(function(rowindex, tr) {
						$cell = $(tr).children().eq(column);
						if (semver.valid( $.trim( $cell.text() ) ) === null) {
							// make invalid semver numbers obvious
							$cell.addClass('red').append(' (invalid)');
						}
					});
				});
			}
		}
	});

});</script>
</head>
<body>

<div id="banner">
	<h1>table<em>sorter</em></h1>
	<h2>Semver Sorting</h2>
	<h3>Flexible client-side table sorting</h3>
	<a href="index.html">Back to documentation</a>
</div>

<div id="main">

	<p class="tip">
		<em>NOTE!</em>
	</p>
	<ul>
		<li>This method does not use a parser nor a widget, it uses <code>semver.js</code> to allow the sorting of <a href="http://semver.org/">semantic version numbers</a>.</li>
		<li>But this method requires a slightly modified version of <a href="https://github.com/isaacs/node-semver">semver.js for node</a>. All modifications are signified within the file to ease updating.</li>
		<li>The modified semver.js (<a href="../js/extras/semver-mod.js">semver-mod.js</a>) is contained in the new "extras" subfolder. Please include it if you need this specific type of sort.</li>
		<li>Invalid version numbers be sorted using a basic text sort, so they will be grouped with their similar version numbers, but not sorted properly; this demo has some extra code to highlight invalid version numbers.</li>
		<li>In this demo, when the semver 2.0.0 compliant version column is sorted, the order column will be in sequential order.</li>
		<li>Semver example order, from semver.org:<br>1.0.0-alpha &lt; 1.0.0-alpha.1 &lt; 1.0.0-alpha.beta &lt; 1.0.0-beta &lt; 1.0.0-beta.2 &lt; 1.0.0-beta.11 &lt; 1.0.0-rc.1 &lt; 1.0.0</li>
	<!-- http://jsfiddle.net/Mottie/abkNM/1626/ -->
	</ul>

	<h1>Demo</h1>
	<div id="demo"><table class="tablesorter">
	<thead>
		<tr>
			<th>Order</th>
			<th>SemVer 2.0.0 compliant versioning</th>
		</tr>
	</thead>
	<tbody>
		<tr><td>6</td><td>1.0.0-beta.2</td></tr>
		<tr><td>8</td><td>1.0.0-rc.1</td></tr>
		<tr><td>2</td><td>1.0.0-alpha.1</td></tr>
		<tr><td>1</td><td>1.0.0-alpha</td></tr>
		<tr><td>10</td><td>1.0.0</td></tr>
		<tr><td>4</td><td>1.0.0-alpha.beta</td></tr>
		<tr><td>3</td><td>1.0.0-alpha.2</td></tr>
		<tr><td>7</td><td>1.0.0-beta.11</td></tr>
		<tr><td>9</td><td>1.0.0-rc.2</td></tr>
		<tr><td>5</td><td>1.0.0-beta</td></tr>
		<tr><td>11</td><td>1.0.0beta</td></tr>
	</tbody>
</table></div>

	<h1>Javascript</h1>
	<div id="javascript">
		<pre class="prettyprint lang-javascript"></pre>
	</div>
	<h1>CSS</h1>
	<div id="css">
		<pre class="prettyprint lang-css"></pre>
	</div>
	<h1>HTML</h1>
	<div id="html">
		<pre class="prettyprint lang-html"></pre>
	</div>

</div>

</body>
</html>
